home *** CD-ROM | disk | FTP | other *** search
/ ftp.alaska-software.com / 2014.06.ftp.alaska-software.com.tar / ftp.alaska-software.com / 3pp / mxsetup.old / {app} / MxDlgs.prg < prev    next >
Text File  |  2001-09-28  |  39KB  |  1,304 lines

  1. //////////////////////////////////////////////////////////////////////
  2. //
  3. // MxDlgs.PRG
  4. //
  5. //  Copyright:
  6. //      Maniacc Software Inc., (c) 2001. All rights reserved.         
  7. //  
  8. //  Contents:
  9. //      Miscellaneous Dialogs
  10. //   
  11. //////////////////////////////////////////////////////////////////////
  12.  
  13. #include "Gra.ch"
  14. #include "Xbp.ch"
  15. #include "Mx.ch"
  16. #include "Common.ch"
  17. #include "Dll.ch"
  18. #include "Appevent.ch"
  19.  
  20. #pragma Library( "BAP.LIB" )
  21.  
  22. DLLFUNCTION GetSysColor ( nIndex ) USING STDCALL FROM USER32.DLL
  23. DLLFUNCTION ChooseColorA( xColor ) USING STDCALL FROM COMDLG32.DLL
  24.  
  25.  
  26. *******************************************************************
  27. * MxMsgBox() - Almost identical to MsgBox(), but better
  28. *******************************************************************
  29.  
  30. PROCEDURE MxMsgBox( cMessage, cTitle, cJustify, cFont, nColorFG, nColorBG)
  31.  
  32.     LOCAL oDlg, oDa, oIcon, oXbp, nEvent, mp1, mp2, nJustify
  33.     LOCAL oFocus := setAppFocus()
  34.     LOCAL aPos := setAppWindow():currentPos(),aSize := {200,100}
  35.  
  36.     DEFAULT cTitle to ""
  37.     DEFAULT cJustify to "L"
  38.     if upper(cJustify)=="C"
  39.         nJustify := XBPSTATIC_TEXT_CENTER
  40.     elseif upper(cJustify)=="R"
  41.         nJustify := XBPSTATIC_TEXT_RIGHT
  42.     else
  43.         nJustify := XBPSTATIC_TEXT_LEFT
  44.     endif
  45.     cFont := iif(!empty(cFont),cFont,MxGetFont("MessageFont"))
  46.     if val(cFont)==0
  47.         cFont := alltrim(str(val(MxGetFont("MessageFont"))))+"."+cFont
  48.     endif
  49.  
  50.     oDlg := MxDialog(,,aPos, aSize,{{XBP_PP_COMPOUNDNAME,cFont}},.F.,cTitle,.T.,.F.,.F.,XBPDLG_RAISEDBORDERTHICK_FIXED )
  51.     oDlg:setFont():codePage := 204
  52.     oDlg:configure()
  53.     oDa := oDlg:drawingArea
  54.  
  55.     if nColorFG<>Nil
  56.         oDa:setColorFG(nColorFG)
  57.     endif
  58.     if nColorBG<>Nil
  59.         oDa:setColorBG(nColorBG)
  60.     endif
  61.  
  62.     oIcon := MxSysIcon(oDa,XBPSTATIC_SYSICON_ICONWARNING,{15,50})
  63.  
  64.     oXbp := MxStatic():new()
  65.     oXbp:caption := cMessage
  66.     oXbp:autoSize := .T.
  67.     oXbp:options := nJustify+iif(chr(13)$cMessage.or.chr(10)$cMessage,XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_WORDBREAK,0)
  68.     oXbp:create( oDa,,{60,50},{0,0} )
  69.  
  70.     aSize[1] := oXbp:currentSize()[1]+90
  71.     aSize[2] := oXbp:currentSize()[2]+(val(cFont)*1.5)+12+56
  72.     aSize[2] := iif(aSize[2]<100,100,aSize[2])
  73.     aSize[2] := iif(oDlg:titlebar.and.aSize[2]<120,120,aSize[2])
  74.  
  75.     oDlg:setSize(aSize)
  76.     oDlg:setPos( {aPos[1]+((setAppWindow():currentSize()[1]-aSize[1])/2),aPos[2]+((setAppWindow():currentSize()[2]-aSize[2])/2)} )
  77.     aSize := oDa:currentSize()
  78.  
  79.     oIcon:setPos({15,aSize[2]-48})
  80.     oXbp:setPos({60,iif(aSize[2]<120,aSize[2]-oXbp:currentSize()[2]-25,aSize[2]-oXbp:currentSize()[2]-15)})
  81.  
  82.     oXbp := MxPushButton():new()
  83.     oXbp:caption := " OK "
  84.     oXbp:create( oDa,,{(aSize[1]-80)/2,10},{80,(val(cFont)*1.5)+12} )
  85.     oXbp:activate := { || PostAppEvent(xbeP_Close,,,oDlg) }
  86.  
  87.     oDlg:show()
  88.     setAppFocus(oXbp)
  89.  
  90.     nEvent := xbe_None
  91.     do while nEvent<>xbeP_Close
  92.         nEvent    := AppEvent( @mp1,@mp2,@oXbp )
  93.         oXbp:handleEvent( nEvent, mp1, mp2 )
  94.     enddo
  95.  
  96.     nEvent := xbeP_None
  97.  
  98. RETURN
  99.  
  100.  
  101.  
  102.  
  103. *******************************************************************
  104. * MxConfirmBox() - Almost identical to ConFirmBox(), but better
  105. *******************************************************************
  106.  
  107. FUNCTION MxConFirmBox( oOwner, cMessage, cTitle, nButtons, nStyle, nStartButton, cJustify, cFont, nColorFG, nColorBG )
  108.  
  109.     LOCAL oDlg, oDa, oIcon, oXbp, mp1, mp2, nEvent
  110.     LOCAL oFocus := setAppFocus()
  111.     LOCAL nMinWidth, nMinHeight := 120
  112.     LOCAL aPos := setAppWindow():currentPos(),aSize := {200,100}
  113.     LOCAL lOK := lCancel := lYes := lRetry := lAbort := lIgnore := lEnter := lNo := .F.
  114.     LOCAL nReturn, nQtyButtons, nOffset := 47
  115.  
  116.     DEFAULT cTitle to ""
  117.     DEFAULT nButtons to XBPMB_OKCANCEL
  118.     DEFAULT nStyle to XBPMB_NOICON
  119.     DEFAULT nStartButton to XBPMB_DEFBUTTON1
  120.     DEFAULT cJustify to "L"
  121.     if upper(cJustify)=="C"
  122.         nJustify := XBPSTATIC_TEXT_CENTER
  123.     elseif upper(cJustify)=="R"
  124.         nJustify := XBPSTATIC_TEXT_RIGHT
  125.     else
  126.         nJustify := XBPSTATIC_TEXT_LEFT
  127.     endif
  128.     cFont := iif(!empty(cFont),cFont,MxGetFont("MessageFont"))
  129.     if val(cFont)==0
  130.         cFont := alltrim(str(val(MxGetFont("MessageFont"))))+"."+cFont
  131.     endif
  132.  
  133.     if nButtons==XBPMB_OK
  134.         lOK := .T.
  135.         nMinWidth := 120
  136.         nQtyButtons := 1
  137.     elseif nButtons==XBPMB_OKCANCEL
  138.         lOK := .T.
  139.         lCancel := .T.
  140.         nMinWidth := 205
  141.         nQtyButtons := 2
  142.     elseif nButtons==XBPMB_RETRYCANCEL
  143.         lRetry := .T.
  144.         lCancel := .T.
  145.         nMinWidth := 205
  146.         nQtyButtons := 2
  147.     elseif nButtons==XBPMB_ABORTRETRYIGNORE
  148.         lAbort := .T.
  149.         lRetry := .T.
  150.         lIgnore := .T.
  151.         nMinWidth := 290
  152.         nQtyButtons := 3
  153.     elseif nButtons==XBPMB_YESNO
  154.         lYes := .T.
  155.         lNo := .T.
  156.         nMinWidth := 205
  157.         nQtyButtons := 2
  158.     elseif nButtons==XBPMB_YESNOCANCEL
  159.         lYes := .T.
  160.         lNo := .T.
  161.         lCancel := .T.
  162.         nMinWidth := 290
  163.         nQtyButtons := 3
  164.     elseif nButtons==XBPMB_CANCEL
  165.         lCancel := .T.
  166.         nMinWidth := 120
  167.         nQtyButtons := 1
  168.     elseif nButtons==XBPMB_ENTER
  169.         lEnter := .T.
  170.         nMinWidth := 120
  171.         nQtyButtons := 1
  172.     elseif nButtons==XBPMB_ENTERCANCEL
  173.         lEnter := .T.
  174.         lCancel := .T.
  175.         nMinWidth := 205
  176.         nQtyButtons := 2
  177.     endif
  178.  
  179.     oDlg := MxDialog(,,aPos, aSize,{{XBP_PP_COMPOUNDNAME,cFont}},.F.,cTitle,.T.,.F.,.F.,XBPDLG_RAISEDBORDERTHICK_FIXED )
  180.     oDa := oDlg:drawingArea
  181.     if nColorFG<>Nil
  182.         oDlg:drawingArea:setColorFG(nColorFG)
  183.     endif
  184.     if nColorBG<>Nil
  185.         oDlg:drawingArea:setColorBG(nColorBG)
  186.     endif
  187.  
  188.  
  189.     if nStyle>=XBPMB_MOVEABLE
  190.         nStyle := nStyle-XBPMB_MOVEABLE
  191.     elseif nStyle>=XBPMB_SYSMODAL
  192.         nStyle := nStyle-XBPMB_SYSMODAL
  193.     endif
  194.  
  195.     if nStyle==XBPMB_NOICON
  196.         nOffset := 0
  197.         nMinHeight := 100
  198.     elseif nStyle==XBPMB_QUESTION
  199.         nStyle := XBPSTATIC_SYSICON_ICONQUESTION
  200.         oIcon := MxSysIcon(oDa,nStyle,{15,50})
  201.     elseif nStyle==XBPMB_WARNING
  202.         nStyle := XBPSTATIC_SYSICON_ICONWARNING
  203.         oIcon := MxSysIcon(oDa,nStyle,{15,50})
  204.     elseif nStyle==XBPMB_INFORMATION
  205.         nStyle := XBPSTATIC_SYSICON_ICONINFORMATION
  206.         oIcon := MxSysIcon(oDa,nStyle,{15,50})
  207.     elseif nStyle==XBPMB_CRITICAL
  208.         nStyle := XBPSTATIC_SYSICON_ICONERROR
  209.         oIcon := MxSysIcon(oDa,nStyle,{15,50})
  210.     endif
  211.  
  212.     oXbp := MxStatic():new()
  213.     oXbp:caption := cMessage
  214.     oXbp:autoSize := .T.
  215.     oXbp:options := nJustify+iif(chr(13)$cMessage.or.chr(10)$cMessage,XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_WORDBREAK,0)
  216.     oXbp:create( oDa,,{60,50},{0,0} )
  217.  
  218.     aSize[1] := oXbp:currentSize()[1]+90
  219.     if aSize[1]<nMinWidth
  220.         aSize[1] := nMinWidth
  221.     endif
  222.     aSize[2] := oXbp:currentSize()[2]+(val(cFont)*1.5)+12+56
  223.     aSize[2] := iif(aSize[2]<nMinHeight,nMinHeight,aSize[2])
  224.  
  225.     oDlg:setSize(aSize)
  226.     oDlg:setPos( {aPos[1]+((setAppWindow():currentSize()[1]-aSize[1])/2),aPos[2]+((setAppWindow():currentSize()[2]-aSize[2])/2)} )
  227.     aSize := oDa:currentSize()
  228.  
  229.     if !empty(oIcon)
  230.         oIcon:setPos({15,aSize[2]-48})
  231.     endif
  232.  
  233.     oXbp:setPos({60,iif(aSize[2]<120,aSize[2]-oXbp:currentSize()[2]-25,aSize[2]-oXbp:currentSize()[2]-15)})
  234.  
  235.     if nQtyButtons==1
  236.         aPos := { (aSize[1]-80)/2,10 }
  237.     elseif nQtyButtons==2
  238.         aPos := { (aSize[1]-165)/2,10 } 
  239.     else
  240.         aPos := { (aSize[1]-250)/2,10 }
  241.     endif
  242.     
  243.  
  244.     if lOK
  245.         oXbp := MxPushButton():new()
  246.         oXbp:caption := CAP_OK
  247.         oXbp:create( oDa,,aPos,{80,(val(cFont)*1.5)+12} )
  248.         oXbp:activate := { || PostAppEvent(xbeP_Close,,,oDlg), nReturn := XBPMB_RET_OK }
  249.         aPos[1] := aPos[1]+85
  250.     endif
  251.     if lAbort
  252.         oXbp := MxPushButton():new()
  253.         oXbp:caption := CAP_ABORT
  254.         oXbp:create( oDa,,aPos,{80,(val(cFont)*1.5)+12} )
  255.         oXbp:activate := { || PostAppEvent(xbeP_Close,,,oDlg), nReturn := XBPMB_RET_ABORT }
  256.         aPos[1] := aPos[1]+85
  257.     endif
  258.     if lYes
  259.         oXbp := MxPushButton():new()
  260.         oXbp:caption := CAP_YES
  261.         oXbp:create( oDa,,aPos,{80,(val(cFont)*1.5)+12} )
  262.         oXbp:activate := { || PostAppEvent(xbeP_Close,,,oDlg), nReturn := XBPMB_RET_YES }
  263.         aPos[1] := aPos[1]+85
  264.     endif
  265.     if lRetry
  266.         oXbp := MxPushButton():new()
  267.         oXbp:caption := CAP_RETRY
  268.         oXbp:create( oDa,,aPos,{80,(val(cFont)*1.5)+12} )
  269.         oXbp:activate := { || PostAppEvent(xbeP_Close,,,oDlg), nReturn := XBPMB_RET_RETRY }
  270.         aPos[1] := aPos[1]+85
  271.     endif
  272.     if lNo
  273.         oXbp := MxPushButton():new()
  274.         oXbp:caption := CAP_NO
  275.         oXbp:create( oDa,,aPos,{80,(val(cFont)*1.5)+12} )
  276.         oXbp:activate := { || PostAppEvent(xbeP_Close,,,oDlg), nReturn := XBPMB_RET_NO }
  277.         aPos[1] := aPos[1]+85
  278.     endif
  279.     if lIgnore
  280.         oXbp := MxPushButton():new()
  281.         oXbp:caption := CAP_IGNORE
  282.         oXbp:create( oDa,,aPos,{80,(val(cFont)*1.5)+12} )
  283.         oXbp:activate := { || PostAppEvent(xbeP_Close,,,oDlg), nReturn := XBPMB_RET_IGNORE }
  284.         aPos[1] := aPos[1]+85
  285.     endif
  286.     if lCancel
  287.         oXbp := MxPushButton():new()
  288.         oXbp:caption := CAP_CANCEL
  289.         oXbp:create( oDa,,aPos,{80,(val(cFont)*1.5)+12} )
  290.         oXbp:activate := { || PostAppEvent(xbeP_Close,,,oDlg), nReturn := XBPMB_RET_CANCEL }
  291.         aPos[1] := aPos[1]+85
  292.     endif
  293.  
  294.     oDlg:show()
  295.  
  296.     if nQtyButtons==1
  297.         setAppFocus(oXbp)
  298.     elseif nQtyButtons==2
  299.         if nStartButton==XBPMB_DEFBUTTON1
  300.             setAppFocus(oDa:childList()[len(oDa:ChildList())-1])
  301.         else
  302.             setAppFocus(oDa:childList()[len(oDa:ChildList())])
  303.         endif
  304.     elseif nQtyButtons==3
  305.         if nStartButton==XBPMB_DEFBUTTON1
  306.             setAppFocus(oDa:childList()[len(oDa:ChildList())-2])
  307.         elseif nStartButton==XBPMB_DEFBUTTON2
  308.             setAppFocus(oDa:childList()[len(oDa:ChildList())-1])
  309.         else
  310.             setAppFocus(oDa:childList()[len(oDa:ChildList())])
  311.         endif
  312.     endif
  313.  
  314.     nEvent := xbe_None
  315.     do while nEvent<>xbeP_Close
  316.         nEvent    := AppEvent( @mp1,@mp2,@oXbp )
  317.         oXbp:handleEvent( nEvent, mp1, mp2 )
  318.     enddo
  319.     nEvent := xbeP_None
  320.  
  321. RETURN nReturn
  322.  
  323.  
  324.  
  325.  
  326. *******************************************************************
  327. * MxGraph() - Display a Graph of Data contained in an Array
  328. *******************************************************************
  329.  
  330. FUNCTION MxGraph( oDa, aPos, aSize, cTitle, cUnits, aValues, aCaptions, aSubCaptions, aColors )
  331.  
  332.     LOCAL oStatic, oXbp, oGraph, oBar, oTxt
  333.     LOCAL nHeight, nWidth, nY_Factor, nX, nY , nMaxValue:= 1, nSpace := 5, nStep
  334.     LOCAL nPeriods:=len(aValues)
  335.     LOCAL nItems:=len(aValues[1])
  336.     LOCAL i,j
  337.     LOCAL aGraphSize := {aSize[1]-70,aSize[2]-80}
  338.     LOCAL aGraphPos  := {60,70}
  339.     LOCAL nIncrements
  340.  
  341.     DEFAULT aCaptions to {""}
  342.     DEFAULT aSubCaptions to {""}
  343.     DEFAULT aColors to {GRA_CLR_PALEGRAY,GRA_CLR_DARKGRAY,GRA_CLR_BLACK}
  344.  
  345.     for i := 1 to nPeriods
  346.         for j := 1 to nItems
  347.             nMaxValue := iif(nMaxValue<aValues[i,j],aValues[i,j],nMaxValue)
  348.         next j
  349.     next i
  350.  
  351.     oXbp := MxStatic():new()
  352.     oXbp:autoSize := .T.
  353.     oXbp:caption  := alltrim(str(nMaxValue))
  354.     oXbp:create( oDa,,{0,0},{0,0},,.F.)
  355.     j := oXbp:currentSize()[1]+16
  356.     aGraphSize[1] := aSize[1]-j-34
  357.     aGraphPos[1]  := j+24
  358.  
  359.     aGraphSize[2] := iif(!empty(aCaptions[1]),aGraphSize[2],aGraphSize[2]+15)
  360.     aGraphSize[2] := iif(!empty(aSubCaptions[1]),aGraphSize[2],aGraphSize[2]+15)
  361.     aGraphSize[2] := iif(!empty(cTitle),aGraphSize[2],aGraphSize[2]+20)
  362.     aGraphPos[2]  := aSize[2]-(aGraphSize[2]+10)
  363.  
  364.     nY_Factor := (aGraphSize[2]-10)/nMaxValue
  365.     nStep := aGraphSize[2]/25    // 25 pixel vertical spacing
  366.     nStep := round((nMaxValue/nStep/25),0)*25    // round to nearest 25 units
  367.  
  368.     nWidth := int( (aGraphSize[1]-((nPeriods-1)*nSpace)-20)/(nPeriods*nItems))
  369.  
  370.     oStatic := MxStatic():new()
  371.     oStatic:type := XBPSTATIC_TYPE_RAISEDRECT
  372.     oStatic:create(oDa,, aPos, aSize,,.F.)
  373.  
  374.     oGraph := MxStatic():new()
  375.     oGraph:type := XBPSTATIC_TYPE_RECESSEDRECT
  376.     oGraph:options := XBPSTATIC_FRAMETHICK
  377.     oGraph:create(oStatic:drawingArea,,aGraphPos,aGraphSize, {{XBP_PP_BGCLR,GRA_CLR_WHITE}})
  378.  
  379.     nIncrements := (aGraphSize[2]-20)/nMaxValue
  380.     for i := 0 to nMaxValue step nStep
  381.         oTxt := XbpStatic():new()
  382.         oTxt:options := XBPSTATIC_TEXT_RIGHT
  383.         oTxt:caption := alltrim(str(i))
  384.         oTxt:create( oStatic:drawingArea, , {22,aGraphPos[2]-5+((i-1)*nIncrements)}, {j,12}, {{XBP_PP_COMPOUNDNAME,"8.Arial"}} )
  385.     next i
  386.     oTxt := MxStatic():new()
  387.     oTxt:caption := cUnits
  388.     oTxt:angle := 90
  389.     oTxt:create( oStatic:drawingArea, , {22,aGraphPos[2]}, {12,aGraphSize[2]}, {{XBP_PP_COMPOUNDNAME,"12.Arial Bold"}} )
  390.     if ((i-1)*nIncrements)<aGraphSize[2]
  391.         oTxt := XbpStatic():new()
  392.         oTxt:options := XBPSTATIC_TEXT_RIGHT
  393.         oTxt:caption := alltrim(str(i))
  394.         oTxt:create( oStatic:drawingArea, , {22,aGraphPos[2]-5+((i-1)*nIncrements)}, {j,12}, {{XBP_PP_COMPOUNDNAME,"8.Arial"}} )
  395.     endif
  396.  
  397.     nX := 10
  398.  
  399.     if !empty(cTitle)
  400.         oTxt := MxStatic():new()
  401.         oTxt:caption := cTitle
  402.         oTxt:options := XBPSTATIC_TEXT_CENTER
  403.         oTxt:create(oStatic:drawingArea,,{0,5},{oStatic:drawingArea:currentSize()[1],20}, {{XBP_PP_COMPOUNDNAME,"12.Arial Bold"}} )
  404.     endif
  405.  
  406.     if empty(cTitle) .or. (empty(aCaptions[1]).and.empty(aSubCaptions[1]))
  407.     else
  408.         oBar := MxStatic():new()
  409.         oBar:type := XBPSTATIC_TYPE_RAISEDBOX
  410.         oBar:create(oStatic:drawingArea,,{oStatic:drawingArea:currentSize()[1]/3,30},{oStatic:drawingArea:currentSize()[1]/3,4} )
  411.     endif
  412.  
  413.     for i := 1 to nPeriods
  414.         if !empty(aCaptions[1])
  415.             oTxt := MxStatic():new()
  416.             oTxt:caption := aCaptions[i]
  417.             oTxt:options := XBPSTATIC_TEXT_CENTER
  418.             oTxt:create(oStatic:drawingArea,,{aGraphPos[1]+nX,aGraphPos[2]-30},{nWidth*nItems,15}, {{XBP_PP_COMPOUNDNAME,"8.Arial Bold"}} )
  419.         endif
  420.         for j := 1 to nItems
  421.             if !empty(aSubCaptions[1])
  422.                 oTxt := MxStatic():new()
  423.                 oTxt:caption := aSubCaptions[j]
  424.                 oTxt:options := XBPSTATIC_TEXT_CENTER
  425.                 oTxt:create(oStatic:drawingArea,,{aGraphPos[1]+nX+(nWidth*(j-1)),aGraphPos[2]-15},{nWidth,15}, {{XBP_PP_COMPOUNDNAME,"8.Arial"}} )
  426.             endif
  427.             oBar := XbpStatic():new()
  428.             oBar:create( oGraph:drawingArea,;
  429.                          oGraph:drawingArea,;
  430.                          {nX+((j-1)*nWidth),0},;
  431.                          {nWidth-1,(int(nY_Factor*aValues[i,j]))-0},;
  432.                          {{XBP_PP_BGCLR,aColors[j]}} )
  433.         next j
  434.         nX := nX + (nItems*nWidth)+nSpace
  435.     next i
  436.  
  437.     oStatic:show()
  438.  
  439. RETURN oStatic
  440.  
  441.     
  442.  
  443.  
  444. *******************************************************************
  445. *******************************************************************
  446. * MxColorDialog() - Select a Color
  447. *******************************************************************
  448. *******************************************************************
  449.  
  450. FUNCTION MxColorDialog( nColor, oDlg, nFullOpen, nCustom )
  451.  
  452.     #define CC_RGBINIT            0x1
  453.     #define CC_FULLOPEN            0x2
  454.     #define CC_PREVENTFULLOPEN        0x4
  455.     #define CC_COLORSHOWHELP        0x8
  456.     #define CC_ENABLEHOOK            0x10
  457.     #define CC_ENABLETEMPLATE        0x20
  458.     #define CC_ENABLETEMPLATEHANDLE    0X40    
  459.     // Win9x Only
  460.     #define CC_SOLIDCOLOR            0x80
  461.     #define CC_ANYCOLOR            0x100
  462.     // End Win9x Only
  463.  
  464.     LOCAL aStruct, cStruct, aXbColors
  465.     LOCAL n, nFlags,nR, nG, nB
  466.  
  467.     STATIC aColors := Nil
  468.     STATIC cArray
  469.  
  470.     default nColor to 0
  471.     default oDlg to setAppWindow():drawingArea
  472.     default nFullOpen to 0
  473.     default nCustom to 0
  474.  
  475.     if nCustom>2
  476.         aColors := Nil
  477.     endif
  478.     nCustom := iif(nCustom>9,nCustom-10,nCustom)
  479.     nCustom := iif(nCustom<0,0,nCustom)
  480.  
  481.     aXbColors := {33554431,33488896,16777471,28883199,;
  482.                   16828416,33554176,16842751,29409472,;
  483.                   16777216,25165824,16777344,23619839,;
  484.                   16809984,29409280,16810176,25198720}
  485.  
  486.     nFlags:=CC_RGBINIT+iif("Windows 9"$os(),CC_SOLIDCOLOR,0)+iif(nFullOpen==-1,CC_PREVENTFULLOPEN,iif(nFullOpen==1,CC_FULLOPEN,0))
  487.  
  488.     if valType(nColor)=="A"
  489.         nColor := (nColor[3]*256*256)+(nColor[2]*256)+nColor[1]
  490.     endif
  491.  
  492.     if aColors==Nil
  493.         cArray := ""
  494.         aColors := Array(16)
  495.         for n:=1 to len(aColors)
  496.             if nCustom==0
  497.                 aColors[n] := 16777215
  498.             elseif nCustom==1
  499.                 if aScan(aColors,GetSysColor(n)-16777216)==0
  500.                     aColors[n] := GetSysColor(n)-16777216
  501.                 else
  502.                     aColors[n] := 16777215
  503.                 endif
  504.                 aSort(aColors)
  505.             elseif nCustom==2
  506.                 aColors[n] := aXbColors[n]-16777216
  507.             endif
  508.         next n
  509.         for n:=1 to len(aColors)
  510.             cArray := cArray+L2Bin(aColors[n])
  511.         next n
  512.     endif
  513.  
  514.     aStruct := BaInit(9)
  515.     BaStruct(aStruct,36)
  516.     BaStruct(aStruct,iif(oDlg==Nil,0,oDlg:getHWND()))
  517.     BaStruct(aStruct,0)
  518.     BaStruct(aStruct,nColor)
  519.     BaStruct(aStruct,@cArray)
  520.     BaStruct(aStruct,nFlags)
  521.     BaStruct(aStruct,0)
  522.     BaStruct(aStruct,0)
  523.     BaStruct(aStruct,0)
  524.  
  525.     cStruct := BaAccess( @aStruct )
  526.  
  527.     if DllCall( "COMDLG32.DLL", DLL_STDCALL, "ChooseColorA", @cStruct ) == 1
  528.         BaExtract( aStruct, cStruct )
  529.         for n:=1 to 3
  530.             nColor := BaExtract( aStruct )
  531.         next n
  532.         cArray := BaExtract( aStruct )
  533.     endif
  534.  
  535.     nB := int(nColor/(256*256))
  536.     nG := int((nColor-(nB*256*256))/256)
  537.     nR := nColor-(nB*256*256)-(nG*256)
  538. //    MxMsgBox("nColor="+alltrim(str(nColor))+chr(10)+"nB="+alltrim(str(nB))+chr(10)+"nG="+alltrim(str(nG))+chr(10)+"nR="+alltrim(str(nR)))
  539.     nColor := GraMakeRGBColor({nR,nG,nB})
  540.  
  541. RETURN nColor
  542.  
  543.     
  544.  
  545. *******************************************************************
  546. *******************************************************************
  547. * MxFontDialog() - Select a Font
  548. *******************************************************************
  549. *******************************************************************
  550.  
  551. FUNCTION MxFontDialog( oParent, oOwner, oScreenPS, oPrinterPS, aPos, cFont )
  552.  
  553.     LOCAL oFont, oFontDlg, oScrnPS
  554.  
  555.     DEFAULT oParent to setAppWindow()
  556.     DEFAULT oOwner to oParent
  557.     DEFAULT cFont to "Times New Roman"
  558.  
  559.     if oParent:className()<>"XbpCRT"
  560.         oScrnPS := iif(empty(oScreenPS),XbpPresSpace():new():create(oParent:winDevice()),oScreenPS)
  561.     endif
  562.  
  563.     oFontDlg := XbpFontDialog():new( oParent, oOwner, oScrnPS, oPrinterPS, aPos )
  564.     oFontDlg:familyName := cFont
  565.     oFontDlg:create()
  566.     oFont := oFontDlg:display()
  567.  
  568.     oFontDlg:destroy()
  569.     oScrnPS:destroy()
  570.  
  571. RETURN oFont //alltrim(str(oFont:nominalPointSize))+"."+oFont:compoundName+iif(oFont:underScore," UnderScore","")
  572.  
  573.  
  574.     
  575. *******************************************************************
  576. * MxModal() - Template for a Modal Dialog
  577. *******************************************************************
  578.  
  579. PROCEDURE MxModal( cTitle )
  580.  
  581.     LOCAL oDlg, oDa, oIcon, oXbp, mp1, mp2, nEvent
  582.     LOCAL oFocus := setAppFocus()
  583.     LOCAL aPos := setAppWindow():currentPos(),aSize := {200,100}
  584.     LOCAL lDone := .F.
  585.  
  586.     DEFAULT cTitle to ""
  587.  
  588.     oDlg := XbpDialog():new()
  589.     oDlg:taskList  := .F.
  590.     oDlg:sysMenu := .F.
  591.     oDlg:title := cTitle
  592.     oDlg:keyboard  := { |nKey,uNil,self|iif(nKey==xbeK_ESC,PostAppEvent(xbeP_Close,,,self),Nil)}
  593.     oDlg:close := {|| MxEnableSiblings(oDlg),oDlg:setModalState(XBP_DISP_MODELESS),oDlg:destroy(),setAppFocus(oFocus),nEvent:=xbe_None}
  594.     oDlg:create(AppDeskTop(),setAppWindow(), aPos, aSize,{{XBP_PP_COMPOUNDNAME,"9.Arial"}},.F. )
  595.     oDa := oDlg:drawingArea
  596.  
  597. // Add your code here for Xbase Parts, etc.
  598.  
  599. //
  600.  
  601.     ***** Show the Dialog and disable the Owner and all Siblings
  602.     oDlg:show()
  603.     oDlg:setModalState(XBP_DISP_APPMODAL)
  604.     MxDisableSiblings( oDlg )
  605.     ***** Set the Focus to this Dialog and the desired Xbase Part
  606.     setAppFocus(oDlg)
  607.     setAppFocus(oXbp)
  608.  
  609.     nEvent := xbe_None
  610.     do while !lDone
  611.         nEvent    := AppEvent( @mp1,@mp2,@oXbp )
  612.         oXbp:handleEvent( nEvent, mp1, mp2 )
  613.     enddo
  614.     nEvent := xbeP_None
  615.  
  616. RETURN
  617.  
  618.  
  619.  
  620. *******************************************************************
  621. * MxDialog() - create a Dialog (SDI Format)
  622. *******************************************************************
  623.  
  624. FUNCTION MxDialog( oParent, oOwner, aPos, aSize, aPresParam, lVisible, cTitle, lModal, TaskList, Sysmenu, Border, Bitmap )
  625.  
  626.     LOCAL oDlg, oDa, oIcon, oXbp, mp1, mp2, nEvent
  627.     LOCAL oFocus := setAppFocus()
  628.  
  629.     DEFAULT oParent to AppDeskTop()
  630.     DEFAULT oOwner to oParent
  631.     DEFAULT aPos to setAppWindow():currentPos()
  632.     DEFAULT aSize to setAppWindow():currentSize()
  633.     DEFAULT aPresParam to Nil
  634.     DEFAULT lVisible to .T.
  635.     DEFAULT cTitle to ""
  636.     DEFAULT lModal to .T.
  637.     DEFAULT TaskList to .F.
  638.     DEFAULT SysMenu to .T.
  639.     DEFAULT Border to XBPDLG_RECESSEDBORDERTHIN_FIXED
  640.  
  641.     if lModal
  642.         oParent := AppDeskTop()
  643.         oOwner := setAppWindow()
  644.     endif
  645.  
  646.     oDlg := XbpDialog():new()
  647.     oDlg:taskList  := taskList
  648.     oDlg:sysMenu := sysMenu
  649.     oDlg:title := cTitle
  650.     oDlg:titlebar := iif(!tasklist.and.!sysmenu.and.empty(cTitle),.F.,.T.)
  651.     oDlg:border := iif(!empty(Border),Border,Nil)
  652.     oDlg:keyboard  := { |nKey,uNil,self|iif(nKey==xbeK_ESC,PostAppEvent(xbeP_Close,,,self),Nil)}
  653.     oDlg:close := {|| MxEnableSiblings(oDlg),oDlg:setModalState(XBP_DISP_MODELESS),oDlg:destroy(),setAppFocus(oFocus),nEvent:=xbe_None}
  654.     oDlg:create(oParent, oOwner, aPos, aSize, aPresParam, lVisible )
  655.  
  656.     if lModal
  657.         oDlg:setModalState(XBP_DISP_APPMODAL)
  658.         MxDisableSiblings( oDlg )
  659.     endif
  660.     setAppFocus( oDlg )
  661.  
  662. RETURN oDlg
  663.  
  664.  
  665.  
  666. *******************************************************************
  667. *   PROCEDURE MxDisableSiblings()
  668. *******************************************************************
  669.  
  670. PROCEDURE MxDisableSiblings( oXbp )
  671.  
  672.     LOCAL i, Parent := oXbp:setParent()
  673.  
  674.     if Parent <> AppDesktop()
  675.         for i := 1 to len(Parent:childList())
  676.             if Parent:childList()[i]<>oXbp
  677.                 Parent:childList()[i]:disable()
  678.             endif
  679.         next i
  680.     endif
  681.  
  682. RETURN
  683.  
  684.  
  685. *******************************************************************
  686. *   PROCEDURE MxEnableSiblings()
  687. *******************************************************************
  688.  
  689. PROCEDURE MxEnableSiblings( oXbp )
  690.  
  691.     LOCAL i, Parent := oXbp:setParent()
  692.  
  693.     if Parent <> AppDesktop()
  694.         for i := 1 to len(Parent:childList())
  695.             if Parent:childList()[i]<>oXbp
  696.                 Parent:childList()[i]:enable()
  697.             endif
  698.         next i
  699.     endif
  700.  
  701. RETURN
  702.  
  703.  
  704.  
  705.  
  706. *******************************************************************
  707. *   PROCEDURE MxPrinterPS()
  708. *******************************************************************
  709.  
  710. FUNCTION MxPrinterPS()
  711.     LOCAL oPS := Nil
  712.     LOCAL oDC := MxSetPrinter(.T.,,,.T.)
  713.     LOCAL oFocus := setAppFocus()
  714.     
  715.     if oDC<>Nil
  716.         oPS:=XbpPresSpace():new()
  717.         oPS:Create( oDC, oDC:paperSize(), GRA_PU_LOMETRIC )
  718.     endif
  719.     setAppFocus(oFocus)
  720. RETURN oPS
  721.  
  722.  
  723.  
  724. *******************************************************************
  725. *   PROCEDURE MxSetPrinter()
  726. *******************************************************************
  727.  
  728. FUNCTION MxSetPrinter(lDisplay,nMode,nPrintRange,lPrintToFile,lMark,lCollate,nCopies,aRange)
  729.  
  730.     LOCAL oDC := XbpPrinter():new(), oPrintDlg
  731.     LOCAL aArray[6]
  732.  
  733.     DEFAULT lDisplay      TO .F.
  734.     DEFAULT nMode         TO XBPPDLG_MODE_DRIVER
  735.     DEFAULT nPrintRange   TO XBPPDLG_PRINT_ALLPAGES
  736.     DEFAULT lPrintToFile  TO .F.
  737.     DEFAULT lMark         TO .F.
  738.     DEFAULT lCollate      TO .F.
  739.     DEFAULT nCopies       TO 1
  740.     DEFAULT aRange        TO {0,0}
  741.  
  742.     if empty(oDC:list())
  743.         MxMsgBox("There are no Printers available on this System")
  744.         RETURN NIL
  745.     else
  746.         oDC:create()
  747.     endif
  748.     if lDisplay
  749.         oPrintDlg := XbpPrintDialog():new():create()
  750.         if nMode<>XBPPDLG_MODE_APPLICATION
  751.             oPrintDlg:mode := XBPPDLG_MODE_DRIVER
  752.         else
  753.             oPrintDlg:mode := nMode
  754.         endif
  755.         oPrintDlg:printRange := nPrintRange
  756.         oPrintDlg:enableMark := lMark
  757.         oPrintDlg:enablePrintToFile := lPrintToFile
  758.         oPrintDlg:enableCollate := lCollate
  759.         oPrintDlg:enableNumCopies := .T.
  760.         oPrintDlg:pageRange := aRange
  761.         oDC := oPrintDlg:display(oDC)
  762.         if !empty(oDC)
  763.             oDC:cargo := {oPrintDlg:printRange,;
  764.                       oPrintDlg:printToFile,;
  765.                       oPrintDlg:collate,;
  766.                       oPrintDlg:numCopies,;
  767.                       oPrintDlg:pageRangeSelected}
  768.         endif
  769.     endif
  770.  
  771. RETURN oDC
  772.  
  773.  
  774.  
  775. *******************************************************************
  776. * MxDebug() - Pops up a small red modal dialog in the upper-right
  777. *             corner of setAppWindow() that allows the value of
  778. *             Public iVar Mx_Debug to be set from 0-10.  This value
  779. *             can them be used to display or suppress debug messages.
  780. *             ie:
  781. *               iif(Mx_Debug>3,MxMsgBox("Message","Title"),Nil)
  782. *******************************************************************
  783.  
  784. PROCEDURE MxDebug()
  785.  
  786.     LOCAL oDlg, oDa, oXbp, nEvent, mp1, mp2, oSpin
  787.     LOCAL aPos := setAppWindow():currentPos(),aSize := {150,70}
  788.  
  789.     aPos[1] := aPos[1]+setAppWindow():currentSize()[1]-152
  790.     aPos[2] := aPos[2]+setAppWindow():currentSize()[2]-72
  791.  
  792.     oDlg := MxDialog(,,aPos, aSize,,.F.,"",.T.,.F.,.F.,XBPDLG_RAISEDBORDERTHICK_FIXED )
  793.     oDa := oDlg:drawingArea
  794.     oDa:setcolorBG(GRA_CLR_RED)
  795.  
  796.     oXbp := MxStatic():new()
  797.     oXbp:caption := "Debug Level:"
  798.     oXbp:autoSize := .T.
  799.     oXbp:create( oDa,,{10,37},{50,20},{{XBP_PP_FGCLR,GRA_CLR_WHITE},{XBP_PP_COMPOUNDNAME,"10.Arial Bold"}} )
  800.  
  801.     oSpin := XbpSpinButton():new()
  802.     oSpin:create( oDa,,{100,37},{35,20},{{XBP_PP_COMPOUNDNAME,"10.Arial Bold"}} )
  803.     oSpin:setNumLimits( 0,10 )
  804.     oSpin:setData(Mx_Debug)
  805.  
  806.     oXbp := MxPushButton():new()
  807.     oXbp:caption := "Done"
  808.     oXbp:create( oDa,,{10,5},{70,24},{{XBP_PP_BGCLR,GRA_CLR_PALEGRAY},{XBP_PP_COMPOUNDNAME,"10.Arial Bold"}} )
  809.     oXbp:activate := { || PostAppEvent(xbeP_Close,,,oDlg) }
  810.  
  811.     oDlg:show()
  812.     setAppFocus(oXbp)
  813.  
  814.     nEvent := xbe_None
  815.     do while nEvent<>xbeP_Close
  816.         nEvent    := AppEvent( @mp1,@mp2,@oXbp )
  817.         oXbp:handleEvent( nEvent, mp1, mp2 )
  818.     enddo
  819.  
  820.     nEvent := xbeP_None
  821.     Mx_Debug := oSpin:getdata()
  822.  
  823. RETURN
  824.     
  825.  
  826.  
  827. *******************************************************************
  828. * MxFontAscii() - Displays the Ascii Chart for any Font
  829. *******************************************************************
  830.  
  831. PROCEDURE MxFontAscii( cFont, lStandAloneApp )
  832.  
  833.     LOCAL oDlg, oDa, oBrowse, oXbp, oTxt, nEvent, mp1, mp2
  834.     LOCAL oFocus := setAppFocus(), oCol, nOldArea := select()
  835.     LOCAL aPos := setAppWindow():currentPos(),aSize := {260,515}
  836.     LOCAL aPresParams, cDbf, cFile, lExit := .F.
  837.     LOCAL Struct, AscStrng, i
  838.  
  839.     DEFAULT cFont to "11.Courier New"
  840.     DEFAULT lStandAloneApp to .F. 
  841.  
  842.     aPos[1] := (AppDeskTop():currentSize()[1]-260)/2
  843.     aPos[2] := (AppDeskTop():currentSize()[2]-515)/2
  844.  
  845.     select (0)
  846.  
  847.     CREATE Struct 
  848.     APPEND BLANK 
  849.     REPLACE FIELD_NAME WITH "Asc" , ; 
  850.             FIELD_TYPE WITH "c" , ; 
  851.             FIELD_LEN  WITH  3 , ; 
  852.             FIELD_DEC  WITH  0 
  853.     APPEND BLANK 
  854.     REPLACE FIELD_NAME WITH "Char" , ; 
  855.             FIELD_TYPE WITH "C" , ; 
  856.             FIELD_LEN  WITH  1 , ; 
  857.             FIELD_DEC  WITH  0 
  858.     CLOSE
  859.  
  860.     for i := 0 to 9
  861.         cDbf := "Asciinf"+alltrim(str(i))+".dbf"
  862.         cFile := curDrive()+":\"+cDbf+".dbf"
  863.         if !file(cFile)
  864.             exit
  865.         endif
  866.     next i
  867.     cDbf := left(cDbf,8)
  868.     CREATE &cFile FROM Struct NEW
  869.     close
  870.     USE &cFile Alias &cDbf EXCLUSIVE NEW
  871.  
  872.     ERASE Struct.dbf 
  873.  
  874.     if lStandAloneApp
  875.         oDlg := setAppWindow()
  876.     else
  877.         oDlg := MxDialog(,,aPos, aSize,{{XBP_PP_COMPOUNDNAME,"10.Courier New"}},.F.,"Ascii Font Viewer",.T.,.F.,.T.,XBPDLG_RAISEDBORDERTHICK_FIXED )
  878.         oDlg:drawingArea:setColorBG(graMakeRGBcolor({130,150,180}))
  879.     endif
  880.     oDlg:close := { || lExit := .T. }
  881.     oDa := oDlg:drawingArea
  882.  
  883.     for i := 1 to 255
  884.         append blank
  885.         replace Asc with padl(alltrim(str(i)),3)
  886.         replace Char with chr(i)
  887.     next i
  888.  
  889.     oXbp := MxStatic():new()
  890.     oXbp:type := XBPSTATIC_TYPE_RAISEDBOX
  891.     oXbp:create( oDa,,{18,453},{224,26},{{XBP_PP_BGCLR,GRA_CLR_PALEGRAY}} )
  892.  
  893.     oTxt := XbpStatic():new()
  894.     oTxt:tabstop := .F.
  895.     oTxt:caption := right(cFont,len(cFont)-at(".",cFont))
  896.     oTxt:create( oXbp:drawingArea,,{4,0},{216,20},{{XBP_PP_COMPOUNDNAME,"12.Arial Bold"}} )
  897.  
  898.     oXbp := MxStatic():new()
  899.     oXbp:type := XBPSTATIC_TYPE_RAISEDBOX
  900.     oXbp:create( oDa,,{18,18},{122,425},{{XBP_PP_BGCLR,GRA_CLR_PALEGRAY}} )
  901.  
  902.     oBrowse := XbpBrowse():new()
  903.     oBrowse:autoSize := .F.
  904.     oBrowse:sizeCols := .F.
  905.     oBrowse:cursorMode := XBPBRW_CURSOR_NONE
  906.     oBrowse:hscroll := .F.
  907.     oBrowse:create( oXbp:drawingArea,,{2,2},{115,418} )
  908.  
  909.     oBrowse:stableBlock := {| | oBrowse:InvalidateRect() }
  910.  
  911.     ************** Navigation code blocks for the browser
  912.     oBrowse:skipBlock     := {|n| DbSkipper(n)}
  913.     oBrowse:goTopBlock    := {| | DbGoTop()    }
  914.     oBrowse:goBottomBlock := {| | DbGoBottom() }
  915.     oBrowse:phyPosBlock   := {| | Recno()      }
  916.  
  917.     if oBrowse:vScroll
  918.         ******* Navigation code blocks for the vertical scroll bar
  919.         oBrowse:firstPosBlock := {| | 0               }
  920.         oBrowse:lastPosBlock  := {| | 100             }
  921.         oBrowse:posBlock      := {| | DbPosition()    }
  922.         oBrowse:goPosBlock    := {|n| DbGoPosition(n) }
  923.     endif
  924.  
  925.     cField := FieldName( 1 )
  926.     aPresParams := {{XBP_PP_COL_HA_CAPTION,"Asc"},;
  927.                     {XBP_PP_COL_DA_BGCLR,GRA_CLR_WHITE},;
  928.                     {XBP_PP_COL_HA_ALIGNMENT,XBPALIGN_HCENTER},;
  929.                     {XBP_PP_COL_DA_CELLALIGNMENT,XBPALIGN_LEFT},;
  930.                     {XBP_PP_COL_DA_ROWHEIGHT,17},;
  931.                     {XBP_PP_COL_DA_ROWWIDTH,50},;
  932.                     {XBP_PP_COL_DA_CELLFRAMELAYOUT,XBPFRAME_NONE}}
  933.     oCol := XbpColumn():new(,,,,aPresParams)
  934.     oCol:dataLink := FieldBlock(cField)
  935.     oCol:create()
  936.     oBrowse:addColumn( oCol )
  937.     oCol:dataArea:setFontCompoundName("10.Courier New Bold")
  938.  
  939.     cField := FieldName( 2 )
  940.     aPresParams := {{XBP_PP_COL_HA_CAPTION,"Char"},;
  941.                     {XBP_PP_COL_DA_BGCLR,GRA_CLR_WHITE},;
  942.                     {XBP_PP_COL_DA_FGCLR,GRA_CLR_DARKRED},;
  943.                     {XBP_PP_COL_HA_ALIGNMENT,XBPALIGN_HCENTER},;
  944.                     {XBP_PP_COL_DA_CELLALIGNMENT,XBPALIGN_HCENTER},;
  945.                     {XBP_PP_COL_DA_ROWHEIGHT,17},;
  946.                     {XBP_PP_COL_DA_ROWWIDTH,50},;
  947.                     {XBP_PP_COL_DA_CELLFRAMELAYOUT,XBPFRAME_NONE}}
  948.     oCol := XbpColumn():new(,,,,aPresParams)
  949.     oCol:datalink := FieldBlock(cField)
  950.     oCol:create()
  951.     oCol := oBrowse:addColumn( oCol )
  952.     oCol:dataArea:setFontCompoundName(cFont+iif(!" Bold"$cFont," Bold",""))
  953.  
  954.     oXbp := MxPushButton():new()
  955.     oXbp:caption := "Change"+chr(13)+"Font"
  956.     oXbp:tabstop := .T.
  957.     oXbp:create( oDa,,{150,18},{90,50},{{XBP_PP_COMPOUNDNAME,"12.Arial Bold"},;
  958.                                         {XBP_PP_BGCLR,GRA_CLR_BLUE},;
  959.                                         {XBP_PP_FGCLR,GRA_CLR_WHITE}} )
  960.     oXbp:activate := { |x| x:=setFont( oDa, , oBrowse, right(cFont,len(cFont)-at(".",cFont)) ),;
  961.                               cFont:=iif(!empty(x),x,cFont),;
  962.                               oTxt:setCaption(right(cFont,len(cFont)-at(".",cFont))) }
  963.  
  964.     goto 32
  965.  
  966.     oDa := oDlg:drawingArea
  967.  
  968.     if lStandAloneApp
  969.         oXbp := MxStatic():new()
  970.         oXbp:caption := "CopyRight 2001"+;
  971.                         chr(13)+;
  972.                         "Maniacc Software"
  973.         oXbp:create( oDa,,{150,318},{90,125},{{XBP_PP_COMPOUNDNAME,"8.Arial"}} )
  974.         oXbp := AddPicture( oDa,{150,340},{90,0},"C:\Apptests\MxLib\Cabin3.bmp" )
  975.     endif
  976.  
  977.     oDlg:show()
  978.     oBrowse:show()
  979.  
  980.     nEvent := xbe_None
  981.     do while !lExit
  982.         nEvent    := AppEvent( @mp1,@mp2,@oXbp )
  983.         oXbp:handleEvent( nEvent, mp1, mp2 )
  984.         
  985.     enddo
  986.  
  987.     close
  988.  
  989.     delete file &cFile
  990.  
  991.     select (nOldArea)
  992.     if !lStandAloneApp
  993.         oDlg:destroy()
  994.     endif
  995.     setAppFocus( oFocus )
  996.  
  997. RETURN
  998.  
  999.  
  1000.  
  1001.  
  1002. *******************************************************************
  1003. * MxStringInfo() - Displays ASCII Values for a String
  1004. *******************************************************************
  1005.  
  1006. PROCEDURE MxStringInfo( cString, cFont, lStandAloneApp )
  1007.  
  1008.     #define  ARR_NO    2              // 'record pointer' for array
  1009.  
  1010.     LOCAL oDlg, oDa, oSle, oBrowse, oXbp, nEvent, mp1, mp2
  1011.     LOCAL oFocus := setAppFocus(), oCol, nOldArea := select()
  1012.     LOCAL aPos := setAppWindow():currentPos(),aSize := {310,515}
  1013.     LOCAL aPresParams, cDbf, lExit := .F.
  1014.     LOCAL Struct, i
  1015.  
  1016.     DEFAULT cString to "Enter a Text String Here"
  1017.     DEFAULT cFont to "11.Courier New"
  1018.     DEFAULT lStandAloneApp to .F. 
  1019.  
  1020.     aPos[1] := (AppDeskTop():currentSize()[1]-310)/2
  1021.     aPos[2] := (AppDeskTop():currentSize()[2]-515)/2
  1022.  
  1023.     select (0)
  1024.  
  1025.     CREATE Struct 
  1026.     APPEND BLANK 
  1027.     REPLACE FIELD_NAME WITH "Pos" , ; 
  1028.             FIELD_TYPE WITH "c" , ; 
  1029.             FIELD_LEN  WITH  4 , ; 
  1030.             FIELD_DEC  WITH  0 
  1031.     APPEND BLANK 
  1032.     REPLACE FIELD_NAME WITH "Char" , ; 
  1033.             FIELD_TYPE WITH "C" , ; 
  1034.             FIELD_LEN  WITH  1 , ; 
  1035.             FIELD_DEC  WITH  0 
  1036.     APPEND BLANK 
  1037.     REPLACE FIELD_NAME WITH "Asc" , ; 
  1038.             FIELD_TYPE WITH "c" , ; 
  1039.             FIELD_LEN  WITH  4 , ; 
  1040.             FIELD_DEC  WITH  0 
  1041.     CLOSE 
  1042.  
  1043.     for i := 0 to 9
  1044.         cDbf := "AscStrg"+alltrim(str(i))
  1045.         cfile := curDrive()+":\"+cDbf+".dbf"
  1046.         if !file(cFile)
  1047.             exit
  1048.         endif
  1049.     next i
  1050.     cDbf := left(cDbf,8)
  1051.     CREATE &cFile FROM Struct NEW
  1052.     close
  1053.     USE &cFile Alias &cDbf EXCLUSIVE NEW
  1054.  
  1055.     ERASE Struct.dbf 
  1056.  
  1057.     if lStandAloneApp
  1058.         oDlg := setAppWindow()
  1059.     else
  1060.         oDlg := MxDialog(,,aPos, aSize,{{XBP_PP_COMPOUNDNAME,"10.Courier New"}},.F.,"String Information",.T.,.F.,.T.,XBPDLG_RAISEDBORDERTHICK_FIXED )
  1061.         oDlg:drawingArea:setColorBG(graMakeRGBcolor({130,150,180}))
  1062.     endif
  1063.     oDlg:close := { || lExit := .T. }
  1064.  
  1065.     oDa := oDlg:drawingArea
  1066.  
  1067.     oSle := XbpSle():new()
  1068.     oSle:bufferLength := 255
  1069.     oSle:tabstop := .T.
  1070.     oSle:create( oDa,,{20,455},{270,20} )
  1071.     oSle:dataLink := { |x| iif(x==Nil,cString,cString:=x) }
  1072.     oSle:setdata( cString )
  1073.  
  1074.     cString := oSle:getdata()
  1075.  
  1076.     for i := 1 to len(cString)
  1077.         append blank
  1078.         replace Pos with padl(alltrim(str(i)),4)
  1079.         replace Char with cString[i]
  1080.         replace Asc with padl(alltrim(str(asc(cString[i]))),4)
  1081.     next i
  1082.  
  1083.     oXbp := MxStatic():new()
  1084.     oXbp:type := XBPSTATIC_TYPE_RAISEDBOX
  1085.     oXbp:create( oDa,,{18,18},{172,425},{{XBP_PP_BGCLR,GRA_CLR_PALEGRAY}} )
  1086.  
  1087.     oBrowse := XbpBrowse():new()
  1088.     oBrowse:autoSize := .F.
  1089.     oBrowse:sizeCols := .F.
  1090.     oBrowse:cursorMode := XBPBRW_CURSOR_NONE
  1091.     oBrowse:hscroll := .F.
  1092.     oBrowse:create( oXbp:drawingArea,,{2,2},{165,418} )
  1093.  
  1094.     oBrowse:stableBlock := {| | oBrowse:InvalidateRect() }
  1095.  
  1096.     ************** Navigation code blocks for the browser
  1097.     oBrowse:skipBlock     := {|n| DbSkipper(n)}
  1098.     oBrowse:goTopBlock    := {| | DbGoTop()    }
  1099.     oBrowse:goBottomBlock := {| | DbGoBottom() }
  1100.     oBrowse:phyPosBlock   := {| | Recno()      }
  1101.  
  1102.     if oBrowse:vScroll
  1103.         ******* Navigation code blocks for the vertical scroll bar
  1104.         oBrowse:firstPosBlock := {| | 0               }
  1105.         oBrowse:lastPosBlock  := {| | iif(reccount()>17,reccount()*2,1)      }
  1106.         oBrowse:posBlock      := {| | DbPosition()    }
  1107.         oBrowse:goPosBlock    := {|n| DbGoPosition(n) }
  1108.     endif
  1109.  
  1110.     cField := FieldName( 1 )
  1111.     aPresParams := {{XBP_PP_COL_HA_CAPTION,"Pos"},;
  1112.                     {XBP_PP_COL_DA_BGCLR,GRA_CLR_WHITE},;
  1113.                     {XBP_PP_COL_HA_ALIGNMENT,XBPALIGN_HCENTER},;
  1114.                     {XBP_PP_COL_DA_CELLALIGNMENT,XBPALIGN_LEFT},;
  1115.                     {XBP_PP_COL_DA_ROWHEIGHT,17},;
  1116.                     {XBP_PP_COL_DA_ROWWIDTH,50},;
  1117.                     {XBP_PP_COL_DA_CELLFRAMELAYOUT,XBPFRAME_NONE}}
  1118.     oCol := XbpColumn():new(,,,,aPresParams)
  1119.     oCol:dataLink := FieldBlock(cField)
  1120.     oCol:create()
  1121.     oBrowse:addColumn( oCol )
  1122.     oCol:setFontCompoundName("10.Courier New")
  1123.  
  1124.     cField := FieldName( 2 )
  1125.     aPresParams := {{XBP_PP_COL_HA_CAPTION,"Char"},;
  1126.                     {XBP_PP_COL_DA_BGCLR,GRA_CLR_WHITE},;
  1127.                     {XBP_PP_COL_DA_FGCLR,GRA_CLR_DARKRED},;
  1128.                     {XBP_PP_COL_HA_ALIGNMENT,XBPALIGN_HCENTER},;
  1129.                     {XBP_PP_COL_DA_CELLALIGNMENT,XBPALIGN_HCENTER},;
  1130.                     {XBP_PP_COL_DA_ROWHEIGHT,17},;
  1131.                     {XBP_PP_COL_DA_ROWWIDTH,50},;
  1132.                     {XBP_PP_COL_DA_CELLFRAMELAYOUT,XBPFRAME_NONE}}
  1133.     oCol := XbpColumn():new(,,,,aPresParams)
  1134.     oCol:datalink := FieldBlock(cField)
  1135.     oCol:create()
  1136.     oCol := oBrowse:addColumn( oCol )
  1137.     oCol:dataArea:setFontCompoundName(cFont+iif(!" Bold"$cFont," Bold",""))
  1138.  
  1139.     cField := FieldName( 3 ) 
  1140.     aPresParams := {{XBP_PP_COL_HA_CAPTION,"Asc"},;
  1141.                     {XBP_PP_COL_DA_BGCLR,GRA_CLR_WHITE},;
  1142.                     {XBP_PP_COL_HA_ALIGNMENT,XBPALIGN_HCENTER},;
  1143.                     {XBP_PP_COL_DA_CELLALIGNMENT,XBPALIGN_LEFT},;
  1144.                     {XBP_PP_COL_DA_ROWHEIGHT,17},;
  1145.                     {XBP_PP_COL_DA_ROWWIDTH,50},;
  1146.                     {XBP_PP_COL_DA_CELLFRAMELAYOUT,XBPFRAME_NONE}}
  1147.     oCol := XbpColumn():new(,,,,aPresParams)
  1148.     oCol:dataLink := FieldBlock(cField)
  1149.     oCol:create()
  1150.     oBrowse:addColumn( oCol )
  1151.     oCol:dataArea:setFontCompoundName("11.Courier New Bold")
  1152.  
  1153.     go top
  1154.     oBrowse:goTopBlock
  1155.  
  1156.     oDa := oDlg:drawingArea
  1157.  
  1158.     if lStandAloneApp
  1159.         oXbp := MxStatic():new()
  1160.         oXbp:caption := "CopyRight 2001"+;
  1161.                         chr(13)+;
  1162.                         "Maniacc Software"
  1163.         oXbp:create( oDa,,{200,398},{90,45},{{XBP_PP_COMPOUNDNAME,"8.Arial"}} )
  1164.         oXbp := AddPicture( oDa,{200,340},{90,0},"C:\Apptests\MxLib\Cabin3.bmp" )
  1165.     endif
  1166.  
  1167.     oXbp := MxPushButton():new()
  1168.     oXbp:caption := "Change"+chr(13)+"Font"
  1169.     oXbp:tabstop := .T.
  1170.     oXbp:create( oDa,,{200,18},{90,50},{{XBP_PP_COMPOUNDNAME,"12.Arial Bold"},;
  1171.                                         {XBP_PP_BGCLR,GRA_CLR_BLUE},;
  1172.                                         {XBP_PP_FGCLR,GRA_CLR_WHITE}} )
  1173.     oXbp:activate := { |x| x:=setFont( oDa, oSle, oBrowse, right(cFont,len(cFont)-at(".",cFont)) ),cFont:=iif(!empty(x),x,cFont) }
  1174.  
  1175.     setAppFocus(oDlg)
  1176.     oDlg:show()
  1177.     oBrowse:show()
  1178.  
  1179.     setAppFocus(oSle)
  1180.     oSle:setMarked( { 1,len(alltrim(oSle:editbuffer()))+1 } )
  1181.  
  1182.     nEvent := xbe_None
  1183.     do while !lExit
  1184.         nEvent    := AppEvent( @mp1,@mp2,@oXbp )
  1185.         oXbp:handleEvent( nEvent, mp1, mp2 )
  1186.         if oSle:changed.or.len(cString)<>reccount()
  1187.             setBrowse( oSle:editbuffer(), oBrowse )
  1188.             if empty(oSle:editbuffer())
  1189.                 oSle:setdata("")
  1190.             endif
  1191.         endif
  1192.     enddo
  1193.  
  1194.     close
  1195.  
  1196.     delete file &cFile
  1197.  
  1198.     select (nOldArea)
  1199.     if !lStandAloneApp
  1200.         oDlg:destroy()
  1201.     endif
  1202.     setAppFocus( oFocus )
  1203.  
  1204. RETURN
  1205.  
  1206.  
  1207. STATIC FUNCTION setBrowse( cString, oBrowse )
  1208.  
  1209.     LOCAL i, cCheckString := "", nRec := recno()
  1210.  
  1211.  
  1212.     if reccount()>0
  1213.         if empty(cString)
  1214.             dbZap()
  1215.             oBrowse:gotopBlock
  1216.             oBrowse:refreshall()
  1217.         else
  1218.             go top
  1219.             do while !eof()
  1220.                 cCheckString := cCheckString+Char
  1221.                 skip
  1222.             enddo
  1223.             goto nRec
  1224.             if cCheckString==cString
  1225.                 RETURN Nil
  1226.             else
  1227.                 DbZap()
  1228.             endif
  1229.         endif
  1230.     elseif empty(cString)
  1231.         RETURN Nil
  1232.     endif
  1233.  
  1234.     for i := 1 to len(cString)
  1235.         append blank
  1236.         replace Pos with padl(alltrim(str(i)),4)
  1237.         replace Char with cString[i]
  1238.         replace Asc with padl(alltrim(str(asc(cString[i]))),4)
  1239.     next i
  1240.     oBrowse:goTopBlock
  1241.     goto iif(len(cString)<oBrowse:rowCount,1,len(cString)-oBrowse:rowCount+1)
  1242.     oBrowse:refreshAll()
  1243.  
  1244. RETURN Nil
  1245.  
  1246.  
  1247.  
  1248. STATIC FUNCTION setFont( oDa, oSle, oBrowse, cFont )
  1249.  
  1250.     LOCAL nDeltaY, i := 6
  1251.     LOCAL aPoints
  1252.     LOCAL cFontName
  1253.     LOCAL oFont, oPS, oCol := oBrowse:getColumn(2)
  1254.  
  1255.     oPS := oDa:lockPS()
  1256.     oFont := XbpFont():new( oPS )
  1257.     oFont:familyName := "Courier New Bold"
  1258.     oFont:height := 0
  1259.     oFont:width  := 0
  1260.     oFont:nominalPointSize := 10
  1261.     oFont:create()
  1262.     aPoints := GraQueryTextBox( oPS, "Test" )
  1263.     nDeltaY := aPoints[1,2]-aPoints[2,2]
  1264.     oFont:destroy()
  1265.  
  1266.     oFont := MxFontDialog( oDa,,,, {20,20}, cFont )
  1267.     if !empty(oFont)
  1268.         cFontName := oFont:compoundName
  1269.         oFont:destroy()
  1270.         oFont := XbpFont():new( oPS )
  1271.         oFont:familyName := cFontName
  1272.         oFont:height := 0
  1273.         oFont:width  := 0
  1274.         oFont:nominalPointSize := i
  1275.         oFont:create()
  1276.         GraSetFont( oPS, oFont )
  1277.         do while (GraQueryTextBox(oPS,"Test")[1,2] - GraQueryTextBox(oPS,"Test")[2,2])<nDeltaY
  1278.             oFont:destroy()
  1279.             i := i+1
  1280.             oFont := XbpFont():new( oPS )
  1281.             oFont:familyName := cFontName
  1282.             oFont:height := 0
  1283.             oFont:width  := 0
  1284.             oFont:nominalPointSize := i
  1285.             oFont:create()
  1286.             GraSetFont( oPS, oFont )
  1287.         enddo
  1288.         cFont := alltrim(str(oFont:nominalPointSize))+"."+oFont:compoundName
  1289.         oCol:dataArea:setFontCompoundName(cFont)
  1290.         if !empty(oSle)
  1291.             oSle:setFontCompoundName("10."+oFont:compoundName)
  1292.         endif
  1293.         oBrowse:refreshAll()
  1294.     endif
  1295.     oDa:unlockPS( oPS )    
  1296.  
  1297. RETURN cFont
  1298.  
  1299.  
  1300.  
  1301.  
  1302.  
  1303.  
  1304.